package org.langqiao.algorithm;
/*
 * 方阵的主对角线之上称为“上三角”。
请你设计一个用于填充n阶方阵的上三角区域的程序。填充的规则是：使用1，2，3….的自然数列，从左上角开始，按照顺时针方向螺旋填充。
例如：当n=3时，输出：
1 2 3
6 4
5
当n=4时，输出：
1  2 3 4
9 10 5
8  6
7
当n=5时，输出：
  1  2  3  4  5
 12 13 14  6 
 11 15  7
 10  8
  9
程序运行时，要求用户输入整数n（3~20）
程序输出：方阵的上三角部分。
要求格式：每个数据宽度为4，右对齐。
要求考生把所有类写在一个文件中。调试好后，存入与考生文件夹下对应题号文件夹中的“解答.txt”中即可。相关的工程文件不要拷入。请不要使用package语句。
另外，源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。

 */
import java.util.*;
public class TriangleMatrix1 {
	private static int a[][]=new int[102][102];//初始化一个二维数组
	private static int num=1;//一定要定义在主方法的 外面，因为如果放在fill方法中，递归调用fill方法后，每次都会将num从新初始化
	public static void main(String[] args)
	{
		while(true){
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入n的值为：");
	    int n=sc.nextInt(); 
	    fill(1,n);
	    for(int i=1;i<=n;i++)//遍历数组打印出结果
	    {
	    	for(int j=1;j<=n-i+1;j++)
	    	{
	    		if(a[i][j]==0)
	    		a[i][j]=a[i][j-1]+1;//存在没有赋值的元素要对他进行赋值，即最后一个元素赋值
		    	System.out.printf("%4d",a[i][j]);//数据宽度为4
		   	}
		   	System.out.println();
	  }}
	}
	public static void fill(int k,int n)//k为起始的值，n为终止值，组成三角形的第一条边
	{
		if(k==n||k>n)
			return;
		for(int i=k;i<=n;i++)
		{
			a[k][i]=num++;//为三角形 的第一条边赋值
		}
		for(int i=k+1,j=n-1;i<=n;i++,j--)//为三角形的第二条边即三角形斜边赋值，
		{
			a[i][j]=num++;
		}
		for(int i=n-1;i>=k+1;i--)//为三角形的第三边赋值
		{
			a[i][k]=num++;
		}
		fill(k+1,n-2);//递归调用
		
	}

}
